# -*- coding: utf-8 -*-
"""
@Time : 2024/9/29 20:35
@Author : ChenXiaoliang
@Email : middlegod@sina.com
@File : generate_text_pics.py
"""

import os

from PIL import Image, ImageDraw, ImageFont


def generate_text_pics(text):
    # 打开图片文件
    image = Image.open(r'./img/stationery.jpg')
    image_width, image_height = image.size
    draw = ImageDraw.Draw(image)
    # 设置文字的字体和大小
    try:
        # 阿里妈妈东方大楷
        font = ImageFont.truetype(r'./font/jianhao.ttf', 68)
    except IOError:
        # 如果找不到字体文件，使用默认字体
        font = ImageFont.load_default()

    # 文字颜色
    text_color = 'black'  # 黑色

    # 计算每列文字的起始位置，这里假设每行文字间隔50像素
    start_x = 1030
    start_y = 120
    text_spacing = 5  # 每行文字的垂直间隔
    font_height = font.getsize("A")[1]  # 获取字体的高度

    # 列数。默认只有最右侧的一列
    columns = 1
    # 一列的最高高度可写的字数
    nums_of_words_in_a_column = 1

    x_position = start_x
    y_position = start_y

    text = text.strip().replace('\n', '').replace('\t', '').replace('\r', '')
    print("文字长度：", len(text))

    punctuation = "。？！，、；：“”‘’（）——《》【】·~ ./,''\"\":?[]"
    duration_ls = []

    if os.listdir('pics_for_video'):
        for i in os.listdir('pics_for_video'):
            # 换存储位置了 无须再保留
            # if i == "stationery.jpg":
            #     continue
            target_to_delete = os.path.join('pics_for_video', i)
            os.remove(target_to_delete)

    for i, char in enumerate(text):
        # 当只有最右侧的一列时
        if columns == 1:
            # y轴坐标
            y_position = start_y + (text_spacing + font_height) * i
            # 判断是否超出列的高度，如果超出需要做换列逻辑的代码实现
            if y_position + text_spacing > image_height - start_y:
                # 表示列数的变量+1
                columns += 1
                # 更新x轴坐标
                x_position = start_x - (columns - 1) * 108
                # 更新y轴坐标
                y_position = start_y
            elif y_position + font_height + text_spacing <= image_height - start_y:
                # 确定一列最多能写入的文字数量
                nums_of_words_in_a_column += 1
            # 根据x轴、y轴坐标最终确定位置信息text_position
            text_position = (x_position, y_position)
        # 当有第2列以及第n列时
        else:
            # 列数大于1 —— 且存在换列情况
            if y_position + font_height + text_spacing > image_height - start_y:
                # 如果超出列高，列数变量继续加1
                columns += 1
            # 依据列数变量确定最新的x轴坐标
            x_position = start_x - (columns - 1) * 108
            # 依据列最多能容纳的字数以及当前字符所在的位置-取模 来计算出y轴坐标
            y_position = start_y + (text_spacing + font_height) * (i % nums_of_words_in_a_column)
            # 根据x轴、y轴坐标最终确定位置信息text_position
            text_position = (x_position, y_position)

        # 把字符写入图片
        draw.text(text_position, char, fill=text_color, font=font)

        # 保存修改后的图片
        # ts = time.strftime("%Y%m%d%H%M%S", time.localtime())
        # 宽度为3，不足0填充
        image_name = f'pics_for_video/stationery_full_content_{i:03}.jpg'
        image.save(f'./{image_name}')

        if char in punctuation:
            t = 0
        else:
            t = 0.3
        duration_ls.append(t)
    # 重置最后一个元素的值，通常最后一个元素为标点符号，如果是则展示时间为0 即不会展示。所以要特殊重置一下。
    duration_ls[-1] = 0.02
    # 生成封面图片
    image.save(r'./pics_for_video/stationery.jpg')

    # 循环结束后，最终的duration_ls添加封面的时间
    # 空白页的展示时间，例如2s（如果有标题，会展示标题），即duration_ls的第一个元素
    duration_ls.insert(0, 2)
    return duration_ls


if __name__ == "__main__":
    text_info = """大雨落幽燕，
白浪滔天，
秦皇岛外打鱼船。
一片汪洋都不见，
知向谁边？
往事越千年，
魏武挥鞭，
东临碣石有遗篇。
萧瑟秋风今又是，
换了人间。"""
    generate_text_pics(text_info)
